package com.atguigu.mybatis.mapper;

import com.atguigu.mybatis.bean.Employee;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * Created by Smexy on 2022/12/30
 *
 *      无需为接口提供实现类。
 *      Mybatis可以通过动态代理技术，自动为接口提供实现对象！
 */
public interface EmployeeMapper3
{
    /*
        Parameter 'efjaklfeakl' not found. Available parameters are [arg1, arg0, param1, param2]

           mapper.getEmployeeById(4,"a");

        如果一个方法中传入了多个参数，此时多个参数会封装为一个Map集合。
            参数key会以  arg0---argN,param1----paramN代替。



         { arg0 = 4, arg1 = 'a' , param1 = 4 ,param2 = 'a'}

         在占位符中，如果是多个参数，#{xxxx},xxx就不能随便写了，必须编写 参数Map中key的名字，根据key获取对应参数的值。

     */
    @Select("select  * from employee where id = #{param1}")
    Employee getEmployeeById(Integer id,String name);


    /*
        自己为参数明确起参数名。
               { a = 4, b = 'a' }
     */
    @Select("select  * from employee where id = #{a}")
    Employee getEmployeeById2(@Param("a") Integer id, @Param("b") String name);

    /*
        除了写 #{xxx},还能写${xxx}

        #{} : 在读取参数后，会根据参数的类型，自动填充占位符。
                如果读取的是字符串，那么会自动为参数添加 引号

        ${} : 在读取参数后，直接把参数添加在sql后面，不做任何的类型处理。
                在某些特殊的位置，必须直接拼接时，可以使用${},举例在表名的位置
     */
    @Select("select  * from employee where last_name = #{b}")
    Employee getEmployeeById3(@Param("a") Integer id, @Param("b") String name);


    /*
            在参数位置，可以使用 #{},在其他的位置，如果要拼接sql，最好使用${}
     */
    @Select("select  * from ${a} where last_name = #{b}")
    Employee getEmployeeById4(@Param("a") String table, @Param("b") String name);

}
